﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RS.Echarts.Models
{
    /// <summary>
    /// 直角坐标系内绘图网格，单个grid内最多可以放置上下两个X轴，左右两个Y轴。可以在网格上绘制折线图、柱状图、散点图（气泡图）。
    /// 在ECharts 2.x里单个echarts实例中最多只能存在一个grid组件，在ECharts 3中可以存在任意个grid组件。
    /// </summary>
    public class Grid
    {
        /// <summary>
        /// 组件ID。默认不指定。指定则可用于在option或者API中引用组件。
        /// </summary>
        public string? Id { get; set; }

        /// <summary>
        /// 是否显示直角坐标系网格。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 所有图形的zlevel值。zlevel用于Canvas分层，不同zlevel值的图形会放置在不同的Canvas中，Canvas分层是一种常见的优化手段。
        /// 我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的Canvas会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
        /// zlevel大的Canvas会放在zlevel小的Canvas的上面。
        /// </summary>
        public int ZLevel { get; set; }

        /// <summary>
        /// 组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
        /// z相比zlevel优先级更低，而且不会创建新的Canvas。
        /// </summary>
        public int Z { get; set; }

        /// <summary>
        /// grid组件离容器左侧的距离。left的值可以是像20这样的具体像素值，可以是像'20%'这样相对于容器高宽的百分比，也可以是'left'、'center'、'right'。
        /// 如果left的值为'left'、'center'、'right'，组件会根据相应的位置自动对齐。
        /// </summary>
        public string? Left { get; set; }

        /// <summary>
        /// grid组件离容器上侧的距离。top的值可以是像20这样的具体像素值，可以是像'20%'这样相对于容器高宽的百分比，也可以是'top'、'middle'、'bottom'。
        /// 如果top的值为'top'、'middle'、'bottom'，组件会根据相应的位置自动对齐。
        /// </summary>
        public int Top { get; set; }

        /// <summary>
        /// grid组件离容器右侧的距离。right的值可以是像20这样的具体像素值，可以是像'20%'这样相对于容器高宽的百分比。
        /// </summary>
        public string? Right { get; set; }

        /// <summary>
        /// grid组件离容器下侧的距离。bottom的值可以是像20这样的具体像素值，可以是像'20%'这样相对于容器高宽的百分比。
        /// </summary>
        public int Bottom { get; set; }

        /// <summary>
        /// grid组件的宽度。默认自适应。
        /// </summary>
        public string? Width { get; set; }

        /// <summary>
        /// grid组件的高度。默认自适应。
        /// </summary>
        public string? Height { get; set; }

        /// <summary>
        /// grid区域是否包含坐标轴的刻度标签。
        /// 当containLabel为false时，grid.left、grid.right、grid.top、grid.bottom、grid.width、grid.height决定的是由坐标轴形成的矩形的尺寸和位置，适用于多个grid进行对齐的场景。
        /// 当containLabel为true时，grid.left、grid.right、grid.top、grid.bottom、grid.width、grid.height决定的是包括了坐标轴标签在内的所有内容所形成的矩形的位置，常用于防止标签溢出的场景。
        /// </summary>
        public bool ContainLabel { get; set; }

        /// <summary>
        /// 网格背景色，默认透明。颜色可以使用RGB表示，如'rgb(128, 128, 128)'，若要加上alpha通道，可使用RGBA，如'rgba(128, 128, 128, 0.5)'，也可以使用十六进制格式，如'#ccc'。
        /// 注意：此配置项生效的前提是，设置了show: true。
        /// </summary>
        public string? BackgroundColor { get; set; }

        /// <summary>
        /// 网格的边框颜色。支持的颜色格式同backgroundColor。
        /// 注意：此配置项生效的前提是，设置了show: true。
        /// </summary>
        public string? BorderColor { get; set; }

        /// <summary>
        /// 网格的边框线宽。
        /// 注意：此配置项生效的前提是，设置了show: true。
        /// </summary>
        public int BorderWidth { get; set; }

        /// <summary>
        /// 图形阴影的模糊大小。该属性配合shadowColor、shadowOffsetX、shadowOffsetY一起设置图形的阴影效果。
        /// 注意：此配置项生效的前提是，设置了show: true以及值不为transparent的背景色backgroundColor。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 阴影颜色。支持的格式同color。
        /// 注意：此配置项生效的前提是，设置了show: true。
        /// </summary>
        public string? ShadowColor { get; set; }

        /// <summary>
        /// 阴影水平方向上的偏移距离。
        /// 注意：此配置项生效的前提是，设置了show: true。
        /// </summary>
        public int ShadowOffsetX { get; set; }

        /// <summary>
        /// 阴影垂直方向上的偏移距离。
        /// 注意：此配置项生效的前提是，设置了show: true。
        /// </summary>
        public int ShadowOffsetY { get; set; }

        /// <summary>
        /// 本坐标系特定的tooltip设定。
        /// </summary>
        public Tooltip? Tooltip { get; set; }
    }

    /// <summary>
    /// 提示框组件的通用介绍。
    /// 提示框组件可以设置在多种地方：
    /// 可以设置在全局，即tooltip。
    /// 可以设置在坐标系中，即grid.tooltip、polar.tooltip、single.tooltip。
    /// 可以设置在系列中，即series.tooltip。
    /// 可以设置在系列的每个数据项中，即series.data.tooltip。
    /// </summary>
    public class Tooltip
    {
        /// <summary>
        /// 是否显示提示框组件，包括提示框浮层和axisPointer。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 触发类型。可选值为'item'（数据项图形触发，主要在散点图、折线图等无类目轴的图表中使用）、'axis'（坐标轴触发，主要在柱状图、折线图等有类目轴的图表中使用）、'none'（不触发）。
        /// </summary>
        public string? Trigger { get; set; }

        /// <summary>
        /// 坐标轴指示器配置项。
        /// </summary>
        public AxisPointer? AxisPointer { get; set; }

        /// <summary>
        /// 提示框浮层的位置，默认不设置时位置会跟随鼠标的位置。
        /// </summary>
        public string? Position { get; set; }

        /// <summary>
        /// 提示框浮层内容格式器，支持字符串模板和回调函数两种形式。
        /// </summary>
        public string? Formatter { get; set; }

        /// <summary>
        /// 数值格式化器，用于格式化提示框中的数值。
        /// </summary>
        public string? ValueFormatter { get; set; }

        /// <summary>
        /// 提示框浮层的背景颜色。
        /// </summary>
        public string? BackgroundColor { get; set; }

        /// <summary>
        /// 提示框浮层的边框颜色。
        /// </summary>
        public string? BorderColor { get; set; }

        /// <summary>
        /// 提示框浮层的边框宽度。
        /// </summary>
        public int BorderWidth { get; set; }

        /// <summary>
        /// 提示框浮层内边距，单位px，默认各方向内边距为5。
        /// </summary>
        public int[]? Padding { get; set; }

        /// <summary>
        /// 提示框浮层的文本样式。
        /// </summary>
        public TextStyle? TextStyle { get; set; }

        /// <summary>
        /// 额外的CSS样式，可用于自定义提示框的样式。
        /// </summary>
        public string? ExtraCssText { get; set; }
    }

    /// <summary>
    /// 坐标轴指示器配置项。
    /// </summary>
    public class AxisPointer
    {
        /// <summary>
        /// 指示器类型。可选值为'line'（直线指示器）、'shadow'（阴影指示器）、'cross'（十字准星指示器）。默认为'line'。
        /// </summary>
        public string? Type { get; set; }

        /// <summary>
        /// 坐标轴指示器是否自动吸附到点上。默认自动判断。
        /// </summary>
        public bool? Snap { get; set; }

        /// <summary>
        /// 直线指示器配置项。
        /// </summary>
        public LineStyle? LineStyle { get; set; }

        /// <summary>
        /// 阴影指示器配置项。
        /// </summary>
        public ShadowStyle? ShadowStyle { get; set; }

        /// <summary>
        /// 十字准星指示器的横线和竖线的样式。
        /// </summary>
        public CrossStyle? CrossStyle { get; set; }
    }

    /// <summary>
    /// 直线指示器配置项。
    /// </summary>
    public class LineStyle
    {
        /// <summary>
        /// 直线的颜色。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 直线的宽度。
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// 直线的类型。可选值为'solid'（实线）、'dashed'（虚线）、'dotted'（点线）。
        /// </summary>
        public string? Type { get; set; }

        /// <summary>
        /// 直线的阴影颜色。
        /// </summary>
        public string? ShadowColor { get; set; }

        /// <summary>
        /// 直线的阴影模糊大小。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 直线的阴影偏移量。
        /// </summary>
        public int[]? ShadowOffset { get; set; }
    }

    /// <summary>
    /// 阴影指示器配置项。
    /// </summary>
    public class ShadowStyle
    {
        /// <summary>
        /// 阴影的颜色。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 阴影的模糊大小。
        /// </summary>
        public int Blur { get; set; }

        /// <summary>
        /// 阴影的偏移量。
        /// </summary>
        public int[]? Offset { get; set; }
    }

    /// <summary>
    /// 十字准星指示器的横线和竖线的样式。
    /// </summary>
    public class CrossStyle
    {
        /// <summary>
        /// 十字准星指示器的颜色。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 十字准星指示器的宽度。
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// 十字准星指示器的类型。可选值为'solid'（实线）、'dashed'（虚线）、'dotted'（点线）。
        /// </summary>
        public string? Type { get; set; }
    }

    /// <summary>
    /// 提示框浮层的文本样式。
    /// </summary>
    public class TextStyle
    {
        /// <summary>
        /// 文字的颜色。
        /// </summary>
        public string? Color { get; set; }

        /// <summary>
        /// 文字的字体。
        /// </summary>
        public string? FontFamily { get; set; }

        /// <summary>
        /// 文字的大小。
        /// </summary>
        public int FontSize { get; set; }

        /// <summary>
        /// 文字的粗细。可选值为'normal'（正常）、'bold'（加粗）、'bolder'（更粗）、'lighter'（更细）或具体的数值（如100、200等）。
        /// </summary>
        public string? FontWeight { get; set; }

        /// <summary>
        /// 文字的行高。
        /// </summary>
        public int LineHeight { get; set; }

        /// <summary>
        /// 文字的对齐方式。可选值为'left'（左对齐）、'center'（居中对齐）、'right'（右对齐）。
        /// </summary>
        public string? Align { get; set; }

        /// <summary>
        /// 文字的垂直对齐方式。可选值为'top'（顶部对齐）、'middle'（中部对齐）、'bottom'（底部对齐）。
        /// </summary>
        public string? VerticalAlign { get; set; }

        /// <summary>
        /// 文字的背景颜色。
        /// </summary>
        public string? BackgroundColor { get; set; }

        /// <summary>
        /// 文字的边框颜色。
        /// </summary>
        public string? BorderColor { get; set; }

        /// <summary>
        /// 文字的边框宽度。
        /// </summary>
        public int BorderWidth { get; set; }

        /// <summary>
        /// 文字的边框半径。
        /// </summary>
        public int BorderRadius { get; set; }

        /// <summary>
        /// 文字的填充颜色。
        /// </summary>
        public string? FillColor { get; set; }

        /// <summary>
        /// 文字的描边颜色。
        /// </summary>
        public string? StrokeColor { get; set; }

        /// <summary>
        /// 文字的描边宽度。
        /// </summary>
        public int StrokeWidth { get; set; }

        /// <summary>
        /// 文字的阴影颜色。
        /// </summary>
        public string? ShadowColor { get; set; }

        /// <summary>
        /// 文字的阴影模糊大小。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 文字的阴影偏移量。
        /// </summary>
        public int[]? ShadowOffset { get; set; }

        /// <summary>
        /// 文字的省略号显示方式。可选值为'clip'（裁剪）、'ellipsis'（省略号）。
        /// </summary>
        public string? Ellipsis { get; set; }
    }
}
